In computer science, a virtual machine (VM) is a portion of software that, when executed on appropriate hardware, creates an environment allowing the virtualization of an actual physical computer system. Each VM may function as a self-contained platform, running its own operating system (OS) and software applications (processes). Typically, a hypervisor manages allocation and virtualization of computer resources and performs context switching, as may be necessary, to cycle between various VMs.
A host machine (e.g., computer or server) is typically enabled to simultaneously run multiple VMs, where each VM may be used by a local or remote client. The host machine allocates a certain amount of the host's resources to each of the VMs. Each VM is then able to use the allocated resources to execute applications, including operating systems known as guest operating systems. The hypervisor virtualizes the underlying hardware of the host machine or emulates hardware devices, making the use of the VM transparent to the guest operating system or the remote client that uses the VM.
One aspect of virtualization is the communication between a host machine and a VM that it hosts. A VM and a host machine typically rely on some type of communication mechanism to accomplish things such as seamless clipboard interaction between the VM and the host machine, communication of a VM shut down to the host machine, and communication that a VM screensaver has initialized or that a desktop in the VM is locked so that the VM can be put in sleep mode for power-saving purposes of the host machine, to name a few examples.
Conventionally, communication between a VM and a host machine was accomplished via networking. However, in some cases, there may not be a network existing between a VM and a host OS that can be used for communication purposes. In addition, there may be completely different administrators with different security protocols in place for each of the VM and the host machine so that a network setup was not possible. In other cases, hypercalls have been used to enable communications between a VM and a host machine. However, hypercalls do not provide for generic communications between a VM and a host machine and are too slow to use. They also may be architecture-dependent (architecture as in i686, x86—64, etc.). As a result, the conventional mechanisms for communication between a VM and a host machine are prone to being disabled or too limiting as to the type of information that can travel between the two entities.